package com.itheima.reggie.web.controller;

import com.itheima.reggie.utils.FileUtil;
import com.itheima.reggie.web.R;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.*;

/**
 * 文件上传下载控制器
 *
 * @Author Vsunks.v
 * @Date 2022/8/14 11:56
 * @Blog blog.sunxiaowei.net/996.mba
 * @Description: 文件上传下载控制器
 */
@Slf4j
@RestController
@RequestMapping("/common")
public class CommonController {

    @Value("${reggie.imgPath}")
    private String imgBasePath;

    @PostMapping("/upload")
    public R upload(MultipartFile file) throws IOException {

        // 获取文件原始名称
        String originalFilename = file.getOriginalFilename();

        // 获取表单项的name值
        // String name = file.getName();
        // System.out.println("name = " + name);

        // 获取文件后缀名
        String[] strs = originalFilename.split("\\.");

        String fileSuffix = strs[strs.length - 1];
        log.info("上传文件后缀为{}", fileSuffix);


        // 生成随机文件名（包含三级目录）
        String fileNameWithPath = FileUtil.getFileNameWithPath();

        // 创建文件夹
        FileUtil.makeDirs(fileNameWithPath, imgBasePath);


        // 保存上传的文件 TODO 优化使用StringBuilder拼接
        file.transferTo(new File(imgBasePath + fileNameWithPath + "." + fileSuffix));

        return R.success("上传成功", fileNameWithPath + "." + fileSuffix);
    }


    /**
     * 下载图片。
     * 从服务器指定位置读取某个图片，写入响应体。
     * @param name  图片的名称
     * @param resp  响应对象
     */
    @GetMapping("/download")
    public void download(String name, HttpServletResponse resp) {
        // 记录日志
        log.info("下载图片：[{}]", name);


        // 在使用response之前，设置一下相应的数据类型，告诉浏览器以什么样的格式解析响应的数据
        resp.setContentType("image/jpeg");

        // 创建输入流，根据基础路径和文件名关联对应的文件
        BufferedInputStream bis = null;
        BufferedOutputStream bos = null;
        try {
            bis = new BufferedInputStream(new FileInputStream(imgBasePath + name));
            // 从响应体获取输出流
            bos = new BufferedOutputStream(resp.getOutputStream());
            // 一边读 一边写
            int len;
            byte[] bytes = new byte[1024];
            while ((len = bis.read(bytes)) > 0) {
                bos.write(bytes, 0, len);
                bos.flush();
            }

        } catch (IOException e) {
            return;
        } finally {
            if (bis != null) {
                try {
                    // 关闭流，释放资源
                    bis.close();
                } catch (IOException e) {
                }
            }
        }


    }
}
